package cn.tkb.user.service.impl;
import cn.tkb.basic.exception.BusinessException;
import cn.tkb.basic.util.SmsUtil;
import cn.tkb.basic.util.StrUtils;
import cn.tkb.user.constant.UserConstants;
import cn.tkb.user.domain.User;
import cn.tkb.user.mapper.UserMapper;
import cn.tkb.user.service.IVerifycodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifycodeServiceImpl implements IVerifycodeService {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private UserMapper userMapper;
    /**
     * 短信验证码方法实现
     * @param phone
     */
    @Override
    @Transactional
    public void SmsCode(Map<String,String> param) {
        String phone = param.get("phone");
        String type = param.get("type");// register:注册  binder：绑定
        //1.校验
        //1.1 手机号不能为空
        if(StringUtils.isEmpty(phone)){
            throw new BusinessException("手机号不能为空,请重新输入！！！");
        }
        String businessKey = "";
        if(type.equals("register")){
            //1.2 手机号是否被注册 查询t_user表
            User user = userMapper.loadByPhone(phone);
            if(user!=null){
                throw new BusinessException("手机号已被注册，请直接登录或者找回密码！！！");
            }
            businessKey=UserConstants.BUSINESS_REGISTER_PREFIX+phone;

        }
        if(type.equals("binder")){//微信绑定验证码
            businessKey=UserConstants.BUSINESS_BINDER_PREFIX+phone;
        }
        sendCode(businessKey);
        //获取验证码
        }

    /**
     * 发送验证码的方法
     * @param businessKey 通过业务键判断是走那种验证码
     */
    public  void sendCode(String businessKey){
        Object codeTmp = redisTemplate.opsForValue().get(businessKey);
        String code="";
        //2.判断验证码是否有效（30分钟），从redis中是否能拿到 key： business_register:15982495855
        if(codeTmp!=null){
            //2.1 如果拿到了 需要判断是否过了1分钟重发时间      value:  9527:14679321341313
            String time = codeTmp.toString().split(":")[1];//拿到时间戳
            if(System.currentTimeMillis()-Long.valueOf(time)<=1*60*1000){
                //2.1.1 如果没有过重发时间,报错：请勿重发获取验证码  1*60*1000
                throw new BusinessException("请勿重复发送验证码");
            }else{
                //2.1.2 如果过了，使用上次的验证码====
                code = codeTmp.toString().split(":")[0];
            }
        }else{
            //2.2 如果拿不到
            //2.2.1 直接生成新的验证码  ===
            code = StrUtils.getComplexRandomString(4);
        }
        // 3.存储redis 设置3分钟过期
        redisTemplate.opsForValue().set(businessKey,code+":"+System.currentTimeMillis(),3,TimeUnit.MINUTES);
        //4.发送短信通知客人 验证码是：9527 请在3分钟内使用
        //SmsUtil.send("15298078862","您的验证码是["+phone+"]，请在3分钟之内使用！！！");
        System.out.println("您的验证码是"+code+"请在三分钟之内使用!!!");
    }
}
